home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AOL File Library: 2,801 to 2,900
/
aol-file-protocol-4400-2801-to-2900.zip
/
AOLDLs
/
C++ Files Library
/
Graphic Gems I, II & III (C_C++)
/
Graphics Gems C Code.sea
/
GemsIII
/
accurate_scan
/
test.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-16
|
5KB
|
221 lines
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <starbase.c.h>
#ifndef M_PI
# define M_PI 3.14159265358979323846
#endif
extern double drand48();
typedef int fixpoint;
extern void subpixel_triangle(fixpoint x0, fixpoint y0,
fixpoint x1, fixpoint y1,
fixpoint x2, fixpoint y2);
extern void triangle(int x0, int y0, int x1, int y1, int x2, int y2);
extern void printnbits();
static int fildes;
static struct color {float r, g, b;};
int verbose = 0;
#define MAXVERTICES 1000
#define MAXTRIANGLES 1000
#define SIZE 200
#define BUFSIZE SIZE*2
int buffer[BUFSIZE][BUFSIZE];
int which_tri;
void clear_buffer()
{
register int i, j;
if (verbose) printf("\n\n************** New Iteration ************\n\n");
for(i=0; i<BUFSIZE; i++)
for(j=0; j<BUFSIZE; j++)
buffer[i][j] = 0;
}
int
InitScreen()
{
char *sb_dev, *driver;
printnbits();
sb_dev = getenv("SB_OUTDEV");
if(!sb_dev) sb_dev = getenv("OUTDEV");
if(!sb_dev) sb_dev = "/dev/crt1";
driver = getenv("SB_OUTDRIVER");
if(!driver) driver = getenv("OUTDRIVER");
if (!driver ) driver = "hp98731";
fildes = gopen(sb_dev,OUTDEV,driver,INIT|INT_XFORM);
interior_style(fildes,INT_SOLID,FALSE);
intvdc_extent(fildes,0,0,SIZE, SIZE);
mapping_mode(fildes,FALSE);
drawing_mode(fildes,6); /* xor mode */
if (!verbose)
double_buffer(fildes,TRUE,12);
clear_control(fildes, CLEAR_VIEWPORT);
return(fildes);
}
int buf = 0;
int t0[MAXTRIANGLES], t1[MAXTRIANGLES], t2[MAXTRIANGLES];
fixpoint x[MAXVERTICES], y[MAXVERTICES];
float xf[MAXVERTICES], yf[MAXVERTICES];
void print_triangle(int n)
{
printf("Triangle %d contains points %d, %d, %d\n", n, t0[n], t1[n], t2[n]);
printf("which is (%g, %g), (%g, %g), (%g, %g)\n",
xf[t0[n]], yf[t0[n]],
xf[t1[n]], yf[t1[n]],
xf[t2[n]], yf[t2[n]]);
printf("which is ");
fp_print(x[t0[n]]);
printf(", ");
fp_print(y[t0[n]]);
printf(", ");
fp_print(x[t1[n]]);
printf(", ");
fp_print(y[t1[n]]);
printf(", ");
fp_print(x[t2[n]]);
printf(", ");
fp_print(y[t2[n]]);
printf("\n");
}
void
draw_point (int ix, int iy)
{
/* if ((ix == 91) && (iy == 74)) {
printf("Triangle painting (%d, %d) ... Triangle %d\n", ix, iy, which_tri);
print_triangle(which_tri); }
*/
if (buffer[ix][iy]){
printf("OOPS -- repainted pixel (%d, %d) for Triangle %d\n",
ix, iy, which_tri);
print_triangle(which_tri);
fill_color(fildes, 1.0, 0.0, 0.5);
intrectangle(fildes,ix,iy,ix+1,iy+1);
fill_color(fildes, 1.0, 1.0, 1.0);
/* dbuffer_switch(fildes, !buf);
make_picture_current(fildes);
abort();
*/
}
else {
buffer[ix][iy] = 1;
intrectangle(fildes,ix,iy,ix+1,iy+1);
}
}
#define CENTER 0.5
main (int argc, char *argv[])
{
int xi[MAXVERTICES], yi[MAXVERTICES];
struct color tc[MAXTRIANGLES];
int nv, nt, i, j, k, white;
double c, s;
float rotinc, xr, yr;
float scale = 90.0;
char *filename = NULL;
FILE *fp;
if (argc == 2) {
filename = argv[1];
printf("reading from file %s\n", filename);
}
if (filename) fp = fopen(filename, "r");
else fp = stdin;
fscanf(fp, "%f %d %d",&rotinc,&white,&nv);
printf("Read header info.\n");
for (i=0; i<nv; i++) fscanf(fp, "%f %f",&xf[i],&yf[i]);
printf("Read %d verts\n", nv);
for (nt=0; (fscanf(fp, "%d %d %d",&t0[nt],&t1[nt],&t2[nt])!=EOF) &&
(nt < MAXTRIANGLES); nt++) {
if (white)
tc[nt].r = tc[nt].g = tc[nt].b = 1.0;
else
tc[nt].r = drand48(), tc[nt].g = drand48(), tc[nt].b = drand48();
}
printf("Read %d triangles\n", nt);
InitScreen();
for (k=0; k<1000; k++) {
c = cos(k*rotinc*M_PI/180.0);
s = sin(k*rotinc*M_PI/180.0);
if (verbose) printf ("%4d: (%g, %g)\n", k, c, s);
for (j=0; j<nv; j++) {
xr = (( xf[j]-CENTER)*c + (yf[j]-CENTER)*s + 0.5);
yr = ((-xf[j]+CENTER)*s + (yf[j]-CENTER)*c + 0.5);
x[j] = fp_fix(xr * scale + 105.0);
y[j] = fp_fix(yr * scale + 32.0);
xi[j] = (int) (xr * scale + 5.5);
yi[j] = (int) (yr * scale + 32.5);
}
clear_view_surface(fildes);
clear_buffer();
for (i=0; i<nt; i++) {
if (verbose)
printf("+++++++++++ Drawing triangle %d ++++++++++\n", i);
which_tri = i;
if (i < nt/2) fill_color(fildes,tc[i].r,tc[i].g,tc[i].b);
else fill_color(fildes,1.0, 1.0, 0.5);
triangle(xi[t0[i]], yi[t0[i]],
xi[t1[i]], yi[t1[i]], xi[t2[i]], yi[t2[i]]);
if (verbose) printf(" Subpixel: ");
subpixel_triangle(x[t0[i]], y[t0[i]],
x[t1[i]], y[t1[i]], x[t2[i]], y[t2[i]]);
if (verbose) make_picture_current(fildes);
}
if (!verbose) {
dbuffer_switch(fildes, buf = !buf);
make_picture_current(fildes);
}
if (verbose) {
printf("hit <return> for next iteration\n");
getchar();
}
}
}